/**
 * 给定数组A，求数组A的所有长度大于等于2的子数组的异或和的和
 * 令 Si 表示子数组A[1...i]的异或，则原式等价于
 *    SIGMA{Si ^ Sj, i从0到N，j从i到N} - 数组A之和
 * 重点是求前一项，按位处理
 * for i in [0...30]:
 *     有多少种选取方法，使得第i位可以为1，记作c
 *     则 (1 << i) * c 对答案有贡献
 *     c计算如下：
 *     对于S[0...N]，令c0为第i位为0的数量，c1为第i位为1的数量
 *     显然 c = c0 * c1
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;
using vll = vector<llt>;
using pii = pair<int, int>;
using pll = pair<llt, llt>;

int N;
vi A;
vi S;

llt proc(){
    S.assign(N + 1, 0);
    for(int i=1;i<=N;++i) S[i] = S[i - 1] ^ A[i];

    llt ans = 0;
    for(int i=0;i<30;++i){
        llt c[2] = {0LL, 0LL};
        for(auto j : S){
            c[(j >> i) & 1] += 1;
        }
        ans += (1LL << i) * c[0] * c[1];
    }
    ans -= accumulate(A.begin(), A.end(), 0LL);
    return ans;
}

void work(){
    cin >> N;
    A.assign(N + 1, 0);
    for(int i=1;i<=N;++i) cin >> A[i];
    cout << proc() << endl;
    return;
}


int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);	
    int nofkase = 1;
	// cin >> nofkase;
	while(nofkase--) work();
	return 0;
}